Java OutOfMemoryError 奇怪的行为
全部标签 在一些遗留代码中看到以下内容:classA{&A(){...}}“&”有什么用?它在VC++2008中编译,看起来像默认构造函数,错误gcc无法编译它。 最佳答案 尽管语法上&在语法的这个位置是允许的(它是一个declarator的例子,它是序列:ptr-operatordeclarator,&是一个ptr-operator),在语义上它没有意义并且在这里是不允许的。纯粹从语法角度来看它是有效的,这一事实可能表明了VisualStudio可能接受它的原因。检查可能性,这个声明看起来像一个没有返回类型的函数定义。7[dcl.dcl]/
当我在MSVSC++2010上运行此代码时:#includeintmain(){constinta=10;constint*b=&a;int*c=(int*)b;*c=10000;std::cout输出是:0037F7840037F784100001010编写该代码的动机是来自Stroustrup的“TheC++ProgrammingLanguage”中的这句话:“可以通过显式类型转换显式地移除对指向const的指针的限制”。我知道试图修改常量在概念上是错误的,但我发现这个结果很奇怪。谁能解释一下背后的原因? 最佳答案 让我们从显而
这是我的简单代码:intmain(){doubled1=10000000000.0;constdoubled2=10000000000.0;cout(d1)(d2)(10000000000.0)输出是:-214748364821474836472147483647这让我大吃一惊。为什么正double有时会转换为负整数?我正在使用g++:GCC版本4.4.3(Ubuntu4.4.3-4ubuntu5)。 最佳答案 当int不足以容纳值时,将double转换为int会产生未定义的行为.[n3290:4.9/1]:Aprvalueofaf
人们通常会对正在编写代码的特定平台做出假设,例如,有符号整数使用二进制补码存储,或者(0xFFFFFFFF==-1),或类似性质的东西。是否存在一种工具可以检查代码库是否存在此类最常见的违规行为(对于我们这些想要可移植代码但没有奇怪的非二进制补码机器的人)?(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣) 最佳答案 您可能希望打开各种级别的编译器警告,您可以将警告视为错误。如果您知道您在代码的不同位置做出了其他假设,您可以断言它们。如果您可以使用静态断言来做到这一点,您将在编译时失败。
默认情况下,std::stack的“底层容器”是std::deque。因此,对于std::deque而言,任何未定义的行为对于std::stack而言都是未定义的行为。cppreference和其他站点在描述成员函数的行为时使用术语“有效地”。我认为这意味着它适用于所有意图和目的。因此,调用top()和pop()等同于调用back()和pop_back(),并在空容器上调用这些是未定义的行为。根据我的理解,它是未定义行为的原因是为了保留不抛出保证。我的理由是std::vector的operator[]具有不抛出保证,如果容器大小大于N,则为未定义行为,但at()有很强的保证,如果n超出
我在某处发现了以下用于将文件读入字符串的习语:std::ifstreamfile("path/to/some/file.ext");std::stringcontents(std::istreambuf_iterator(file),(std::istreambuf_iterator()));它现在工作得很好。但是,如果我删除第二个迭代器参数周围的括号,即:std::stringcontents(std::istreambuf_iterator(file),std::istreambuf_iterator());一旦我尝试在字符串对象上调用任何方法,例如:constchar*buffe
考虑以下代码:classFoo{public://class-specificFoooperator+(Foo&rhs){returnFoo();//Justreturnatemporary}void*operatornew(size_tsd){returnmalloc(sd);}};//globalFoooperator+(Foo&lhs,Foo&rhs){returnFoo();}void*operatornew(size_tsd){returnmalloc(sd);}此代码无法编译,声明调用不明确,因为它匹配两个运算符:Fooa,b;a+b;但是这个带有new运算符的编译得很好,
在下面的代码中:智能指针数据成员pImpl(classImpl)和原始指针pc(classCAT)都是不完整的数据类型,Widget.h中没有这两个类的定义//控件.h#ifndefW_H_#defineW_H_#includeclassWidget{public:Widget();~Widget(){//deletepc;//IknowIshouldput~Widgetto.cpp//Ijustwanttoshowthedifferenceinbehavior//betweenrawpointerandsmartpointer(bothhasincompletetype)//when
我在SUSEEnterpriseLinux11上使用GCC4.7.2和Boost1.58.0。我有以下代码片段,它基本上通过多边形列表来计算它们的长度/宽度。在std::minmax函数中使用“auto”关键字时,我看到了奇怪的输出。为了进行比较,我还声明了第二个变量,其中明确声明了类型(即dim与dim1)。namespacegtl=boost::polygon;typedefgtl::polygon_90_dataLayoutPolygon;typedefgtl::rectangle_dataLayoutRectangle;staticLayoutFeatureVeccalc_st
假设我有以下内容:classA{Bmember1;Cmember2;public:A();};classB{public:C&ref_to_c;B(C&ref_to_c);};classC{...};B要求在其构造函数中提供对C的引用。如果A类提供C,那么指定A的初始化列表如下是否合法...A():member1(B(member2)){}也就是说,member2是否存在于initialiserlist阶段,还是这个undefinedbehavior? 最佳答案 初始化如下:5Initializationshallproceedin